package interfaccia;


import java.awt.Dimension;

import java.awt.event.ActionEvent;
import java.util.Vector;

import javax.swing.*;

import fsmCore.ClasseEquivalenza;
import fsmCore.Macchina;
import fsmCore.Stato;
import fsmCore.Transizione;
import fsmCore.TransizioneSincrona;

public class MenuGestioneMacchina extends Menu {
	
	/*@  
	  @ invariant classiEq.size()>=1 &&
	  @ /forall int i;i < NUMERO_MACCHINA; fsm[i] non_null;
	  @*/
	
	private static final long serialVersionUID = 1L;
	private Macchina fsm;
	
	private static final String[] VOCI = { "InserisciStato" ,"InserisciTransizione", "Cambia classe di equivlenza di una transizione","Elimina Macchina","Visualizza Macchina"};
	private static final String TITOLO = "MenuGestioneMacchina";

	private final static String [] MSG_INPUT_STATO={"Inserisci il nome del nuovo stato","Impossibile aggiungere lo stato perche' gia' presente\nInserisci il nuovo stato"};
	
	
	private Vector<ClasseEquivalenza> classiEq;
			
	public MenuGestioneMacchina(Macchina _fsm, Vector<ClasseEquivalenza> _classiEq) {
		super(TITOLO,VOCI);
		fsm=_fsm;
		classiEq=_classiEq;
		super.getFinestra().setLocation(300, 200);
		setPulsantiEnabled();
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		Object click =e.getSource();
		
		if (click == super.getPulsanti()[0]){
			Stato s= Input.inputStato(MSG_INPUT_STATO[0]);
			Vector<Stato> listaStati=fsm.getListaStati();
			boolean finito=true;
			do{
				if(s!=null){
					finito=true;
				
					for(int i=0;i<listaStati.size();i++){
						if(listaStati.get(i).equals(s))
							finito=false;
					}
					if(!finito)
					s=Input.inputStato(MSG_INPUT_STATO[1]);
				}
			}while(!finito);
			int iniziale;
			if(s!=null){
				iniziale=JOptionPane.showConfirmDialog(null, "e' uno stato iniziale");
				if(iniziale==0)
					fsm.setStatoIniziale(s);
				if(iniziale!=2)
					fsm.inserisciStato(s);
			}
			setPulsantiEnabled();
		}
		else if(click == super.getPulsanti()[1]){
			
			Transizione t= Input.InputTransizione(fsm.getListaStati(), classiEq);
			if(t!=null)
				fsm.inserisciTransizione(t);
			setPulsantiEnabled();
		}

		else if(click == super.getPulsanti()[2]){
	
			Vector<Transizione> listaTransizioni=fsm.getTransizioniSincrone(); 
			TransizioneSincrona sceltaTrans = (TransizioneSincrona)Input.selezionaTransizione("seleziona transizione: ",listaTransizioni);
			ClasseEquivalenza sceltaClasse=null;
			if(sceltaTrans!=null)
				sceltaClasse = Input.selezionaClasseEq("Seleziona la nuova classe di equivalenza",classiEq);
			if(sceltaClasse!=null){
				sceltaTrans.setClasseEq(sceltaClasse);
				JOptionPane.showMessageDialog(null,"La nuova classe di\n" +sceltaTrans.getNome()+"\ne'"+sceltaClasse.getNome());
			}
		
		}
		else if(click == super.getPulsanti()[3]){

			fsm.eliminaMacchina();
			JOptionPane.showMessageDialog(null, "La macchina e' stato eliminata");
			setPulsantiEnabled();
		}
		else if(click == super.getPulsanti()[4]){
			JTextArea text=new JTextArea(fsm.toString());
			text.setEditable(false);
			JScrollPane infoMacchina = new JScrollPane(text);

			infoMacchina.setPreferredSize(new Dimension(500, 500));

			JOptionPane.showMessageDialog(null, infoMacchina, "Info Macchina",JOptionPane.INFORMATION_MESSAGE);
		}
		
	}

	
	private void setPulsantiEnabled() {
		
		//super.getPulsanti()[0].setEnabled(true);
		
		if(fsm.getListaStati().isEmpty())
			super.getPulsanti()[1].setEnabled(false);
		else
			super.getPulsanti()[1].setEnabled(true);
		
		if(fsm.getTransizioniSincrone().isEmpty()) //se non ci sono transizioni non pu� cambiare classeEq
			super.getPulsanti()[2].setEnabled(false);
		else
			super.getPulsanti()[2].setEnabled(true);
		
		//super.getPulsanti()[3].setEnabled(true);
		
		if(fsm.getListaStati().isEmpty()) // per visualizzare la macchina deve aver inserito tutto nei punti sopra
			super.getPulsanti()[4].setEnabled(false);
		else
			super.getPulsanti()[4].setEnabled(true);
		
	}
	
}
